home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / gnuish / swalibas / sw_spve.c < prev    next >
C/C++ Source or Header  |  1990-09-10  |  4KB  |  159 lines

  1. /* sw_spve.c - spawn a child process.
  2.    Copyright (C) 1990 by Thorsten Ohl, td12@ddagsi3.bitnet
  3.  
  4.    This file is part of SWAPLIB (the library), a library for efficient
  5.    execution of child processes under MS-DOS.
  6.  
  7.    The library is free software; you can redistribute it and/or modify
  8.    it under the terms of the GNU General Public License as published by
  9.    the Free Software Foundation; either version 1, or (at your option)
  10.    any later version.
  11.  
  12.    The library is distributed in the hope that it will be useful,
  13.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.    GNU General Public License for more details.
  16.  
  17.    You should have received a copy of the GNU General Public License
  18.    along with the library; if not, write to the Free Software
  19.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  
  21.    $Header: e:/gnu/swaplib/RCS/sw_spve.c'v 0.9 90/09/09 21:44:18 tho Stable $
  22.  */
  23.  
  24. #include <stdio.h>
  25. #include <stdlib.h>
  26. #include <string.h>
  27.  
  28. #include "swaplib.h"
  29.  
  30. char _swap_cmdline_buf[128] = "";
  31. char *_swap_environ_buf = NULL;
  32. char *_swap_respond_file_name = NULL;
  33.  
  34. /* This is the work horse and interface to the code in swap.c  */
  35.  
  36. int
  37. swap_spawnve (char *cmd, char **argv, char **envvec)
  38. {
  39.   int length = -1;        /* failure */
  40.   int rc = 0x02;        /* failure */
  41.   int error = 0;
  42.   int i = 0;
  43.   char *swap_file_name;
  44.   char *shell;
  45.   enum swap_swapping_mode swapping;
  46.   struct swap_respondfile_action *respondfiles;
  47.  
  48.   swap_file_name = swap_mktmpname ("vm");
  49.   swapping = swap_set_swapping_mode (cmd, argv);
  50.  
  51.  
  52.   /* Look whether we have to invoke a shell for executing
  53.      this command.  */
  54.  
  55.   shell = swap_invoke_shell (cmd, &argv);
  56.   if (shell)
  57.     {
  58.       cmd = shell;
  59.  
  60.       /* Provide a hook for doing fancy things with SHELL! */
  61.  
  62.       /* .... */
  63.     }
  64.  
  65.   respondfiles = swap_set_respondfile_actions ();
  66.   if (respondfiles)
  67.     for (i = 0; respondfiles[i].prog; i++)
  68.       if (strcmp (respondfiles[i].prog, argv[0]) == 0)
  69.     break;
  70.  
  71.   if (respondfiles && respondfiles[i].prog)
  72.     {
  73.       /* This program requires special treatment.  */
  74.  
  75.       length = (*respondfiles[i].action) (argv, envvec);
  76.     }
  77.   else if (swap_smart_p (argv[0]))
  78.     {
  79.       /* This is a "smart" program, pass the arguments via the
  80.      environment.  */
  81.  
  82.       length = _swap_format_msdos_environment (argv, envvec, NULL);
  83.     }
  84.   else
  85.     {
  86.       /* This is a dumb program, use the MS-DOS commandline.  */
  87.  
  88.       if (_swap_build_cmdline (argv) == 0)
  89.     length = _swap_format_msdos_environment (NULL, envvec, NULL);
  90.     }
  91.  
  92.   if (length != -1)
  93.     {
  94. #ifdef TEST
  95.   fprintf (stderr, "+ %s %s\n", cmd, _swap_cmdline_buf);
  96. #endif
  97.  
  98.       /* We've given MS-DOS all the help we can offer, we will
  99.      rest now in a quieter storage medium and see what
  100.      happens.  */
  101.  
  102.       rc = _swap_spawn_child (swapping, cmd, _swap_cmdline_buf,
  103.                   _swap_environ_buf, length, swap_file_name);
  104.  
  105.  
  106.       /* Save ERRNO (the cleanup functions migth clobber it).  */
  107.       if (rc == -1)
  108.     error = errno;
  109.  
  110. #ifdef TEST
  111.       fprintf (stderr, "child terminated with 0x%04x\n", rc);
  112. #endif
  113.     }
  114.  
  115.   /* Cleaning up  */
  116.  
  117.   strcpy (_swap_cmdline_buf, "");
  118.  
  119.   if (shell)
  120.     {
  121.       free (shell);
  122.  
  123.       /* We have to free this, since it is not the one
  124.      we've been passed!  */
  125.       free (argv);
  126.     }
  127.   if (swap_file_name)
  128.     free (swap_file_name);
  129.   if (_swap_environ_buf)
  130.     {
  131.       free (_swap_environ_buf);
  132.       _swap_environ_buf = NULL;
  133.     }
  134.   if (_swap_respond_file_name)    /* clean up disk */
  135.     {
  136. #ifndef TEST
  137.       unlink (_swap_respond_file_name);
  138. #else
  139.       fprintf (stderr, "respondfile %s kept.\n", _swap_respond_file_name);
  140. #endif
  141.       free (_swap_respond_file_name);
  142.       _swap_respond_file_name = NULL;
  143.     }
  144.  
  145.  
  146.   /* Set the ERRNO of COMMAND.  */
  147.   errno = error;
  148.  
  149.   return rc;
  150. }
  151.  
  152. /* 
  153.  * Local Variables:
  154.  * mode:C
  155.  * ChangeLog:ChangeLog
  156.  * compile-command:make
  157.  * End:
  158.  */
  159.